#include "temp.h"

void temp_init(void)
{
	GPIO_InitTypeDef gpio_initStruct = {0};

	__HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

	// 初始化温度传感器数据引脚（PA0）- 开漏输出，需要上拉
	gpio_initStruct.Mode = GPIO_MODE_OUTPUT_OD;
	gpio_initStruct.Pin = TEMP_DATA_GPIO_PIN;
	gpio_initStruct.Speed = GPIO_SPEED_FREQ_HIGH;
	gpio_initStruct.Pull = GPIO_PULLUP;
	HAL_GPIO_Init(TEMP_DATA_GPIO_TYPE, &gpio_initStruct);

	// 初始化温度传感器电源开关引脚（PB12）- 推挽输出
	gpio_initStruct.Mode = GPIO_MODE_OUTPUT_PP;
	gpio_initStruct.Pin = TEMP_SWITCH_GPIO_PIN;
	gpio_initStruct.Speed = GPIO_SPEED_FREQ_HIGH;
	gpio_initStruct.Pull = GPIO_NOPULL;
	HAL_GPIO_Init(TEMP_SWITCH_GPIO_TYPE, &gpio_initStruct);

	// 默认上电，确保传感器有电源
	HAL_GPIO_WritePin(TEMP_SWITCH_GPIO_TYPE, TEMP_SWITCH_GPIO_PIN, GPIO_PIN_SET);
	HAL_Delay(50);  // 等待传感器稳定
}

void ONE_WIRE_OUT(void)
{
	GPIO_InitTypeDef gpio_initStruct = {0};
	__HAL_RCC_GPIOA_CLK_ENABLE();
	gpio_initStruct.Mode = GPIO_MODE_OUTPUT_PP;
	gpio_initStruct.Pin = TEMP_DATA_GPIO_PIN;
	gpio_initStruct.Speed = GPIO_SPEED_FREQ_HIGH;
	gpio_initStruct.Pull = GPIO_NOPULL;
	HAL_GPIO_Init(TEMP_DATA_GPIO_TYPE,&gpio_initStruct);
}

void ONE_WIRE_IN(void)
{
	GPIO_InitTypeDef gpio_initStruct = {0};
	__HAL_RCC_GPIOA_CLK_ENABLE();
	gpio_initStruct.Mode = GPIO_MODE_INPUT;
	gpio_initStruct.Pin = TEMP_DATA_GPIO_PIN;
	gpio_initStruct.Speed = GPIO_SPEED_FREQ_HIGH;
	gpio_initStruct.Pull = GPIO_NOPULL;
	HAL_GPIO_Init(TEMP_DATA_GPIO_TYPE,&gpio_initStruct);
}

void ONE_WIRE_H(void)
{
	HAL_GPIO_WritePin(TEMP_DATA_GPIO_TYPE,TEMP_DATA_GPIO_PIN,GPIO_PIN_SET);
}

void ONE_WIRE_L(void)
{
	HAL_GPIO_WritePin(TEMP_DATA_GPIO_TYPE,TEMP_DATA_GPIO_PIN,GPIO_PIN_RESET);
}

unsigned char DS18B20_init(void)
{
	short i = 0;
	ONE_WIRE_OUT();
	ONE_WIRE_H();
	delay_us(5);
	ONE_WIRE_L();
	delay_ms(480);
	ONE_WIRE_H();
	delay_us(60);
	ONE_WIRE_IN();
	//�ȴ��͵�ƽ�ź�
	while((i++ ) < 200)
	{
		delay_1us;
		if (!HAL_GPIO_ReadPin(TEMP_DATA_GPIO_TYPE,TEMP_DATA_GPIO_PIN))break;
	}
	if (200 <= i) return 0;
	//�ȴ����巢�����
	//while(HAL_GPIO_ReadPin(TEMP_DATA_GPIO_TYPE,TEMP_DATA_GPIO_PIN));

	//���͵�ƽ����ʱ���Ƿ��ںϷ���Χ��
	i = 0;
	while((i++) < 240)
	{
		delay_1us;
		if (HAL_GPIO_ReadPin(TEMP_DATA_GPIO_TYPE,TEMP_DATA_GPIO_PIN))break;
	}
	if ( 240 <= i )return 0;
	else return 1;
}

unsigned char DS18B20_Write_Byte(unsigned char val)
{
	unsigned char j = 0;
	unsigned char temp = 0;
	ONE_WIRE_OUT();
	for( j = 0 ; j < 8 ; j ++)
	{
		temp = val & 0x01;
		val >>= 1;
		if (temp)
		{
			//д1
			ONE_WIRE_L();
			delay_us(2);
			ONE_WIRE_H();
			delay_us(60);
		}
		else
		{
			//д0
			ONE_WIRE_L();
			delay_us(60);
			ONE_WIRE_H();
			delay_us(2);
		}
	}
	return 1;
}

unsigned char DS18B20_Read_Bit(void)
{
	unsigned char data = 0;
	ONE_WIRE_OUT();
	ONE_WIRE_L();
	delay_us(2);
	ONE_WIRE_H();
	ONE_WIRE_IN();
	delay_us(15);
	data = HAL_GPIO_ReadPin(TEMP_DATA_GPIO_TYPE,TEMP_DATA_GPIO_PIN);
	delay_us(60);
	return data;
}

unsigned char DS18B20_Read_Byte(void)
{
	unsigned char i = 0, j = 0, data = 0;
	for ( i = 0; i < 8; i++)
	{
		j = DS18B20_Read_Bit();
		data |= (j << i);
	}
	return data;
}

void DS18B20_Start(void)
{
	DS18B20_init();
	DS18B20_Write_Byte(0xCC);	//����ROMָ��
	DS18B20_Write_Byte(0x44);	//�����¶�ת��ָ��
	delay_ms(750);
}

float DS18B20_Get_Temp(void)
{
	unsigned char TL = 0 , TH = 0;
	short temp_raw = 0;
	float temperature = 0.0f;


	DS18B20_Start();
	DS18B20_init();
	DS18B20_Write_Byte(0xCC);	//����ROMָ��
	DS18B20_Write_Byte(0xBE);	//��ʼ��ȡ����
	TL = DS18B20_Read_Byte();
	TH = DS18B20_Read_Byte();

	printf("Raw data: TH=0x%02X, TL=0x%02X\n", TH, TL);  // ���ӵ������

	// 组合16位数据
	temp_raw = (TH << 8) | TL;

	// 判断符号位（bit 15）
	if (temp_raw & 0x8000)
	{
		// 负数：取反加1后取负
		temp_raw = (~temp_raw) + 1;
		temperature = -(float)temp_raw * 0.0625f;
	}
	else
	{
		// 正数
		temperature = (float)temp_raw * 0.0625f;
	}

	return temperature;
}




